package base

import (
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"gopkg.in/natefinch/lumberjack.v2"
	"infra"
	"os"
)

type LogStarter struct {
	infra.BaseStarter
}

func (s *LogStarter) Init(ctx infra.StarterContext) {

	// 限制日志输出级别, >= DebugLevel 会打印所有级别的日志
	// 生产环境中一般使用 >= ErrorLevel
	core := newCore(
		zapcore.DebugLevel,
		"./log/main.log",
		512, // 日志每个文件的大小
		30,  // 天数
		0,   // 最多保存多少个日志
		true)
	logger := zap.New(
		core,
		zap.AddCaller(),
		zap.AddCallerSkip(1),
		zap.Development())
	sugar := logger.Sugar()
	sugar.Info("这是测试")
	logger.Info("测试")
	logger.Debug("ceshi")
}

// newCore zapcore构造
func newCore(level zapcore.Level, filename string, maxSize int, maxAge int, maxBackups int, compress bool) zapcore.Core {
	//日志文件路径配置
	hook := lumberjack.Logger{
		Filename:   filename,   // 日志文件路径
		MaxSize:    maxSize,    // 每个日志文件保存的最大尺寸 单位：M
		MaxAge:     maxAge,     // 文件最多保存多少天
		MaxBackups: maxBackups, // 日志文件最多保存多少个备份
		LocalTime:  true,       // 是否使用本地时间
		Compress:   compress,   // 是否压缩
	}
	//设置日志级别
	atomicLevel := zap.NewAtomicLevel()
	atomicLevel.SetLevel(level)
	//公用编码器
	encoderConfig := zapcore.EncoderConfig{
		TimeKey:        "time",
		LevelKey:       "level",
		NameKey:        "logger",
		CallerKey:      "line",
		MessageKey:     "message",
		StacktraceKey:  "stacktrace",
		LineEnding:     zapcore.DefaultLineEnding,
		EncodeLevel:    zapcore.LowercaseLevelEncoder, // 小写编码器
		EncodeTime:     zapcore.ISO8601TimeEncoder,    // ISO8601 UTC 时间格式
		EncodeDuration: zapcore.SecondsDurationEncoder,
		EncodeCaller:   zapcore.FullCallerEncoder, // 非全路径编码器
		EncodeName:     zapcore.FullNameEncoder,
	}
	return zapcore.NewCore(
		zapcore.NewJSONEncoder(encoderConfig), // 编码器配置
		zapcore.NewMultiWriteSyncer(
			zapcore.AddSync(os.Stdout), // 打印到控制台
			zapcore.AddSync(&hook)), // 打印到文件
		atomicLevel,                 // 日志级别
	)
}
